#include "../include/WebPageSearcher.h" 
#include "../include/WebPageQuery.h"
#include "../log/Logger.hpp" 
//#include "../include/MyRedis.h"
#include "../include/RedisPool.h"
#include "../include/json.h"
#include <memory>
//#include <sw/redis++/redis++.h>
//#include "../include/TcpConnection.h"
using std::unique_ptr;
//using namespace sw::redis;



WebPageSearcher::WebPageSearcher(const std::string& keys/* , const std::shared_ptr<const TcpConnection>& conn */)
: _sought(keys)
//, _conn(conn) 
//,_jieba(jieba)
{}

void WebPageSearcher::doQuery(SplitToolCppJieba&  jieba)
{
    // 执行查询的实现
    WebPageQuery queryStart;//转移到WebPageQuery对象实现分词，查找关键词文章id等
    // WebPageQuery::WebPageQuery()
    // {
    //WebPageQuery使用的构造函数还没有对  这几个容器赋值，在什么时候赋值
    // unordered_map<int, WebPage> _pageLib;                       // 网页库
    // unordered_map<int, pair<int, int>> _offsetLib;              // 偏移库
    // unordered_map<string, set<pair<int, double>>> _invertIndexTable;  // 倒排索引表
    // }
    //LogError("_sought=%s \n",_sought.c_str());


    RedisPool& pool = RedisPool::getInstance();//执行process的是一个线程，这个是个连接池
    redisContext* redis_handle1 = pool.get_conn(1);

    redisReply* reply1  = (redisReply *)redisCommand(redis_handle1, "GET %s", _sought.c_str());
    if(reply1&&reply1->type == REDIS_REPLY_STRING)
    {
            _str_result= reply1->str;
            
            freeReplyObject(reply1);
            reply1 = nullptr;
    }
    //在redis中没有查找到用
    else
    {
        queryStart.doQuery(_sought,jieba);

        //获得vec<string>的结果，并且打包输出格式
        queryStart.getresult(_vec_result);

        //将vec<string>的结果变成字符串发送
        ser_msg msg{200,_vec_result};
        json send_json;
        ser_to_json(send_json,msg);
        _str_result=send_json.dump();
        redisReply* reply2= (redisReply *)redisCommand(redis_handle1, "SET %s %s", _sought.c_str(), _str_result.c_str());
        if (reply2 != NULL && reply2->type == REDIS_REPLY_STATUS) 
        {
            printf("%s\n", reply2->str);
            freeReplyObject(reply2);
            pool.put_conn(1);
        }
    }

    




    //redis对象，并连接
    // unique_ptr<MyRedis> pRedis(new MyRedis());
    // if(!pRedis->connect(1)) //先写1，后期改成线程标识
    // {
    //     std::cerr << "connect error!" << endl;
    //     return;
    // }

    // string ret=pRedis->get(_sought);
    // if(ret.c_str()==nullptr)
    // {
    //      ret=queryStart.doQuery(_sought,jieba);
    //     //获得vec<string>的结果
    //     queryStart.getresult(vec_result);
    //     //将vec<string>的结果变成字符串发送
    //     ser_msg msg{200,vec_result};
    //     json send_json;
    //     ser_to_json(send_json,msg);
    //     str_result=send_json.dump();
    //     pRedis->set(_sought, str_result);
    // }
    // else
    // {
    //     str_result=ret;
    // }
    

    //redis-plus-plus版本
    // string ret;
    // auto redis = Redis("tcp://127.0.0.1:6379");
    // auto val = redis.get(_sought);
    // if(val)
    // {
    //     //std::cout << *val << std::endl;
    //     str_result=*val;
    // }
    // else
    // {
    //     ret=queryStart.doQuery(_sought,jieba);
    //     //获得vec<string>的结果
    //     queryStart.getresult(vec_result);
    //     //将vec<string>的结果变成字符串发送
    //     ser_msg msg{200,vec_result};
    //     json send_json;
    //     ser_to_json(send_json,msg);
    //     str_result=send_json.dump();
    //     redis.set(_sought, str_result);
    // }


    
    cout<<"_str_result:"<<endl<<_str_result<<endl;
    //cout<<"wps ret="<<ret<<endl;
}